package com.example.deepseek.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.example.deepseek.model.ChatMessageEntity;
import com.example.deepseek.model.ChatSessionEntity;
import com.example.deepseek.mapper.ChatMessageMapper;
import com.example.deepseek.mapper.ChatSessionMapper;
import com.example.deepseek.model.ChatSession;
import com.example.deepseek.model.Message;
import com.example.deepseek.service.ChatSessionService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Service
@Slf4j
@RequiredArgsConstructor
public class ChatSessionServiceImpl implements ChatSessionService {

    private final ChatSessionMapper chatSessionMapper;
    private final ChatMessageMapper chatMessageMapper;

    @Override
    @Transactional
    public ChatSession createSession(String name) {
        ChatSession model = new ChatSession(name);

        ChatSessionEntity entity = new ChatSessionEntity();
        entity.setId(model.getId());
        entity.setName(model.getName());

        chatSessionMapper.insert(entity);

        return model;
    }

    @Override
    public List<ChatSession> getAllSessions() {
        // 按更新时间降序排列
        LambdaQueryWrapper<ChatSessionEntity> queryWrapper = Wrappers.<ChatSessionEntity>lambdaQuery()
                .orderByDesc(ChatSessionEntity::getUpdateTime);

        List<ChatSessionEntity> entities = chatSessionMapper.selectList(queryWrapper);
        List<ChatSession> sessions = new ArrayList<>();

        for (ChatSessionEntity entity : entities) {
            ChatSession session = new ChatSession(entity.getName());
            session.setId(entity.getId());
            session.setCreateTime(entity.getCreateTime());
            session.setUpdateTime(entity.getUpdateTime());

            // 加载会话消息
            List<ChatMessageEntity> messageEntities = chatMessageMapper.selectBySessionIdOrderByTimestamp(entity.getId());

            for (ChatMessageEntity messageEntity : messageEntities) {
                Message message = new Message(messageEntity.getRole(), messageEntity.getContent());
                message.setTimestamp(messageEntity.getTimestamp());
                session.getMessages().add(message);
            }

            sessions.add(session);
        }

        return sessions;
    }

    @Override
    public ChatSession getSession(String sessionId) {
        ChatSessionEntity entity = chatSessionMapper.selectById(sessionId);

        if (entity == null) {
            return null;
        }

        ChatSession session = new ChatSession(entity.getName());
        session.setId(entity.getId());
        session.setCreateTime(entity.getCreateTime());
        session.setUpdateTime(entity.getUpdateTime());

        // 加载会话消息
        List<ChatMessageEntity> messageEntities = chatMessageMapper.selectBySessionIdOrderByTimestamp(sessionId);

        for (ChatMessageEntity messageEntity : messageEntities) {
            Message message = new Message(messageEntity.getRole(), messageEntity.getContent());
            message.setTimestamp(messageEntity.getTimestamp());

            // 确保文件内容也被加载
            message.setFileContent(messageEntity.getFileContent());
            message.setTextContent(messageEntity.getTextContent()); // 添加文本内容
            message.setFilePath(messageEntity.getFilePath());
            message.setFileName(messageEntity.getFileName());

            // 记录日志，帮助调试
            if (message.getFileName() != null && !message.getFileName().isEmpty()) {
                // 修复：使用适当的方法获取文件内容长度
                if (message.getTextContent() != null) {
                    log.debug("加载消息中的文本文件内容: 文件名={}, 内容长度={}",
                            message.getFileName(), message.getTextContent().length());
                } else if (message.getFileContent() != null) {
                    log.debug("加载消息中的二进制文件内容: 文件名={}, 内容大小={}字节",
                            message.getFileName(), message.getFileContent().length);
                } else {
                    log.debug("加载消息中的文件信息: 文件名={}, 无内容", message.getFileName());
                }
            }

            session.getMessages().add(message);
        }

        return session;
    }

    @Override
    @Transactional
    public void addMessage(String sessionId, Message message) {
        // 确保消息有时间戳
        if (message.getTimestamp() == null) {
            message.setTimestamp(LocalDateTime.now());
        }

        // 创建消息实体并保存
        ChatMessageEntity messageEntity = new ChatMessageEntity();
        messageEntity.setSessionId(sessionId);
        messageEntity.setRole(message.getRole());
        messageEntity.setContent(message.getContent());
        messageEntity.setTimestamp(message.getTimestamp());

        // 设置文件相关属性
        if (message.getFileName() != null && !message.getFileName().isEmpty()) {
            messageEntity.setFileName(message.getFileName());
            messageEntity.setFilePath(message.getFilePath());

            // 如果有文本内容，优先保存文本内容
            if (message.getTextContent() != null && !message.getTextContent().isEmpty()) {
                messageEntity.setTextContent(message.getTextContent());
                log.debug("保存包含文本文件内容的消息, 文件名: {}, 内容长度: {}",
                        message.getFileName(), message.getTextContent().length());
            }
            // 否则保存二进制内容
            else if (message.getFileContent() != null && message.getFileContent().length > 0) {
                messageEntity.setFileContent(message.getFileContent());
                log.debug("保存包含二进制文件内容的消息, 文件名: {}, 内容大小: {}字节",
                        message.getFileName(), message.getFileContent().length);
            } else {
                log.debug("保存文件信息但无内容, 文件名: {}", message.getFileName());
            }
        }

        chatMessageMapper.insert(messageEntity);

        // 更新会话的更新时间
        ChatSessionEntity sessionEntity = new ChatSessionEntity();
        sessionEntity.setId(sessionId);
        sessionEntity.setUpdateTime(message.getTimestamp());

        chatSessionMapper.updateById(sessionEntity);
    }

    @Override
    @Transactional
    public void clearMessages(String sessionId) {
        chatMessageMapper.deleteBySessionId(sessionId);
    }

    @Override
    @Transactional
    public void deleteSession(String sessionId) {
        // 先删除所有关联消息
        chatMessageMapper.deleteBySessionId(sessionId);

        // 删除会话
        chatSessionMapper.deleteById(sessionId);
    }

    // 在ChatSessionServiceImpl实现类中添加
    @Override
    public void updateSession(ChatSession session) {
        if (session == null || session.getId() == null) {
            log.error("无法更新会话：会话或会话ID为空");
            return;
        }

        try {
            ChatSessionEntity entity = new ChatSessionEntity();
            entity.setId(session.getId());
            entity.setName(session.getName());
            entity.setUpdateTime(LocalDateTime.now());

            chatSessionMapper.updateById(entity);
            log.info("会话更新成功: {}", session.getId());
        } catch (Exception e) {
            log.error("更新会话失败: {}", e.getMessage(), e);
        }
    }
}